11 : Mouvement des objets

Une fois que vous avez compris les mouvements de Sprites, vous voudrez sans doute commencer à interagir avec ces Sprites. Comment les déplacer, et avec quoi ? Si vous avez votre Amiga depuis plus de dix minutes, vous êtes habitué à avoir un joystick dans un port et une souris dans l'autre, ce sont donc évidemment les premiers choix de dispositifs d'entrée. Ensuite, il y a le clavier, parfait pour les jeux type Tetris, ou une option pour ceux qui détestent les joysticks. (Ils existent, je vous assure. Principalement d'anciens utilisateurs de PC !)

Expérience de mouvement

Vous interagissez avec les programmes AMOS en utilisant le clavier, la souris et le joystick, et bien que le clavier soit facile (à condition de connaître le BASIC), faire comprendre à l'ordinateur ce que vous voulez en utilisant la souris et le clavier est plus difficile à maîtriser. Jusqu'à maintenant.

HIDE est la première commande qui vient à l'esprit, et c'est une commande de contrôle de la souris assez simple qui n'a rien à voir avec le mouvement des objets, mais qui, comme nous allons le voir dans un instant, a quelque chose à offrir au programmeur de mouvements à la souris. Cette commande masque le pointeur de la souris, et les raisons pour lesquelles vous voudriez faire cela sont multiples. Principalement, c'est pour libérer l'écran pour une belle image sans permettre à l'utilisateur d'être distrait par l'envie de cliquer sur quelque chose. Si le pointeur de la souris n'est pas utilisé, mais qu'à la place vous utilisez un personnage qui est en fait un Sprite (comme une image numérisée d'une main humaine, par exemple), alors évidemment vous ne voudrez pas que l'ancien pointeur reste affiché à l'écran, n'est-ce pas ?

Ainsi, HIDE renvoie le pointeur. Pour le faire revenir, utilisez simplement la commande SHOW, donc une structure typique ressemblerait à ceci :

Screen Open 0,640,256,4,Hires
Load Iff "charger une image en hires ici"
Hide
Centre ""
Wait Key
Show
Centre ""
Wait Key

Une autre commande utile de la souris est CHANGE MOUSE. Elle permet de changer la forme du pointeur de la souris pour une autre forme prédéfinie ou même l'une de vos propres créations. Voici comment utiliser CHANGE MOUSE :

Change Mouse 1

où le chiffre 1 peut être remplacé par n'importe quel nombre de 1 à 3. Les formes prédéfinies du pointeur sont :

Et si vous choisissez 4, alors le pointeur de la souris sera pris depuis votre banque de Sprites. Ce n'est toutefois pas si simple, car le numéro du Sprite est dérivé en soustrayant 3 au nombre donné. Ainsi, par exemple :

Change Mouse 4

donne le Sprite 1 de la banque actuelle, et :

Change Mouse 5

donne le Sprite 2, et ainsi de suite.

Voici un exemple de programme de lecture de la souris :

Rem * Mousing around.AMOS *
Rem
Print "Mouse pointer on"
Wait Key
Hide
Cls
Print "Mouse pointer off!"
Wait Key
Show
Cls
Change Mouse 3
Print "Mouse back again, but altered"
Print "Move mouse and press button"
Cls
Proc _CHECKMOUSE
End

Procedure _CHECKMOUSE
Do
  Home
  X1=X Mouse : Y1=Y Mouse
  Print "Mouse location = ";X1,Y1
  K=Mouse Key
  If K=0 Then K$="None"
  If K=1 Then K$="Left"
  If K=2 Then K$="Right"
  Print "Mouse key pressed = ";K$
Loop
End Proc

Contrôle d'un Bob avec la souris :

Rem * Mouse follow.AMOS *
Rem
Screen Open 0,320,256,32,Lowres
Flash Off : Hide : Cls 0
Load "df3:sprite_600/space/ship3.abk"
Get Sprite Palette
Double Buffer
Do
  X1=X Mouse : Y1=Y Mouse
  Bob 1,X1-150,Y1-50,1
Loop

Limiter les mouvements de la souris :

Rem * Mouse Limit.AMOS *
Rem
Curs Off : Cls 0
Ink 7
Bar 0,0 To 319,150
Ink 2
Box 0,0 To 319,150
Box 100,100 To 200,50
Pen 0 : Paper 7
Locate 0,1
Centre "* BOUTON GAUCHE limite de la souris *"
Locate 0,3
Centre "* BOUTON DROIT pas de limites *"
Do
  If Mouse Key=1
    Limit Mouse X Hard(0,100),Y Hard(0,100) To X Hard(0,200),Y Hard(0,50)
    X Mouse=X Hard(0,150) : Y Mouse=Y Hard(0,70)
  End If
  If Mouse Key=2 Then Limit Mouse
Loop

Remarquez l'utilisation de X HARD et Y HARD pour positionner précisément la tête du pointeur.

Rem * Retch-As-Ketch.AMOS *
Rem
Curs Off : Cls 0
Paper 0
Pen 3 : Centre "R e t c h - A s - K e t c h"
Locate ,4 : Pen 4 : Centre "Appuyez sur la touche 's' pour sauvegarder un dessin"
Locate ,6 : Pen 2 : Centre "Bouton droit de la souris pour effacer l'écran"
Locate ,24 : Pen 1 : Centre "Appuyez sur une touche pour commencer"
Wait Key : Cls 0
Y Mouse=X Screen(160) : X Mouse=Y Screen(100)
Do
  X=X Mouse : Y=Y Mouse
  M=Mouse Key
  I$=Inkey$
  If M=1 Then Plot X Screen(0,X),Y Screen(0,Y),2
  If M=2 Then Cls 0
  If I$="s" Then SAVIT
Loop

Procedure SAVIT
F$=Fsel$("*.IFF","","Sauvegarder votre dessin")
Save Iff F$
End Proc

Joie profonde

Et ainsi, nous passons au joystick, qui est lu d'une manière tout aussi directe. Évidemment, la principale différence entre le joystick et la souris est que la souris a une coordonnée sur l'écran, tandis que le joystick n'a que huit directions et un bouton de tir.

Il existe des méthodes de lecture du joystick en AMAL, voire en Autotest, mais nous verrons cela dans les chapitres 12 et 13. Pour l'instant, concentrons-nous sur les méthodes de lecture du joystick via AMOS lui-même.

La commande Joy renvoie une valeur indiquant l'état du joystick. Regardons ce segment de code :

Do
Bob 1,X1,Y1,I
J=Joy(1) And 15
Add X1,X(J),10 To 50
Add Y1,Y(J),10 To 20
Exit If Joy(1)>15
Loop

Contentez-vous de l'examiner, ne le tapez pas car il ne fonctionnera pas tel quel. Cet exemple nécessite que vous configuriez des instructions DIM, etc. Mais il montre que vous pouvez lire le port de joystick 1 et passer l'information à une commande de déplacement de Bob pour le faire se déplacer sur l'écran.

En plus d'utiliser la commande complète Joy, vous pouvez interroger chaque direction individuellement avec les commandes Jup, Jdown, Jleft et Jright, ainsi que Fire pour vérifier si le bouton de tir est pressé.

Essayez cet exemple qui vous donnera une bonne idée :

Rem * Joystick Tester *
Rem
Do
If Jleft(1) Then Print "Gauche"
If Jright(1) Then Print "Droite"
If Jup(1) Then Print "Haut"
If Jdown(1) Then Print "Bas"
If Fire(1) Then Print "==TIR!=="
Loop

La direction est importante pour l'animation comme nous l'avons vu dans le chapitre sur la création de Sprites. Voici comment c'est fait :

Rem * Directional Joystick.AMOS *
Rem
Flash Off : Hide : Curs Off : Cls 0
Load "df0:sprite_600/vehicle/superbik.abk"
Ink 2
Polygon 100,75 To 200,75 To 319,200 To 0,200 To 100,75
Ink 1
Polygon 150,75 To 155,75 To 159,100 To 155,100
Polygon 156,110 To 164,150 To 170,150 To 159,110
Polygon 174,159 To 185,200 To 176,200 To 170,159
Locate ,3
Paper 0
Centre "Use the joystick to lean the bike!"
Double Buffer
Get Sprite Palette
X1=100 : Y1=100 : I=11
Bob 1,X1,Y1,I
Do
  If Jleft(1) Then Dec I
  If I<1 Then I=1
  If Jright(1) Then Inc I
  If I>20 Then I=20
  If I>11 Then A=25
  If I<=11 Then A=0
  Bob 1,X1+A,Y1,I
  Wait Vbl
Loop

Vous pouvez transmettre les mouvements du joystick au pointeur de la souris, ou les utiliser pour déplacer un écran :

Rem * Joystick Screen Move.AMOS *
Rem
Screen Open 1,320,256,32,Lowres
Flash Off : Curs Off : Hide : Cls
Load Iff "df0:iff/amospic.iff",1
Screen Display 1,X Hard(0,0),Y Hard(0,0),320,256
X=0 : Y=0
Screen Copy 0,0,0,319,100 To 0,639,0
Do
If Joy(1)=%100 Then X=X-6
If Joy(1)=%1000 Then X=X+6
Screen Offset 1,X,0
Wait Vbl
Loop

Contrôles clavier

Pour utiliser le clavier, on peut utiliser INKEY$ :

Do
X$=Inkey$
If X$<>"" Then Print X$
Loop

Ou pour détecter une touche spéciale avec son scancode :

Rem * Scancode.AMOS *
Rem
Screen Open 0,640,256,16,Hires
Hide : Paper 0 : Cls 0
Do
  While KEE$=""
    KEE$=Inkey$
  Wend
  If Asc(KEE$)=0 Then Print "**Spéciale touche !**"
  Print "Scancode pour la touche :";Scancode
  KEE$=""
Loop

Tout assembler

Et pour finir, un vrai petit jeu AMOS :

Rem * Blaster.AMOS *
Rem
Hide : Curs Off : Flash Off
Unpack 6 To 0
Dim ALIEN(5)
For I=1 To 5
  Sam Play 15,1,20000
  Wait 5
Next I
Wait 25
Track Loop On
Track Play 3
Repeat
Until Joy(1)
Track Stop
Flash Off
Screen Open 1,320,200,16,Lowres
Double Buffer
Get Sprite Palette
SCORE=0

NEWGAME:
Cls 0
LIVES=3 : BUGS=5 : SX=50 : SY=100 : AX=320 : AY=30
MISSFLAG=0 : SHIPFLAG=0 : ALIENFLAG=0
Curs Off
Cls 0
Locate 15,10 : Paper 0 : Print "Score: ";SCORE
Wait 100
Cls 0
Ink 15
For Z=1 To 50
  Plot Rnd(320),Rnd(200)
Next Z
For Z=1 To 5
  ALIEN(Z)=0
Next Z

Repeat
  If Jleft(1) and SX>30 Then SX=SX-2
  If Jright(1) and SX<320 Then SX=SX+2
  If Jup(1) and SY>0 Then SY=SY-2
  If Jdown(1) and SY<199 Then SY=SY+2
  Bob 1,SX,SY,1
  If SHIPFLAG=1 Then Bob Off 1 : SX=50 : SY=100
  Wait Vbl

  For J=1 To 5
    If ALIEN(J)=1 Then Goto SKIP
    Bob J+2,AX,AY+SPACE,3
SKIP:
    SPACE=SPACE+30
    If SPACE>120 Then SPACE=0
  Next J

  AX=AX-2
  If AX=-30 Then ALIENFLAG=0
  If AX=-30 Then SHIPFLAG=0
  If AX=-30 Then AX=320

  If Fire(1) and MISSFLAG=0 Then
    Sam Play 1
    MISSFLAG=1
    Bob 2,SX,SY,2
    MX=SX : MY=SY
  End If

  If MISSFLAG=1 Then
    Add MX,5
    Bob 2,MX,MY,2
    If MX>SX+100 Then Bob Off 2 : MISSFLAG=0
  End If

  If Bob Col(1,3 To 7) and SHIPFLAG=0 Then Gosub _BOOM
  If Bob Col(2,3 To 7) and ALIENFLAG=0 Then Gosub _ABOOM
Until LIVES=0 or BUGS=0

Wait 25
Sam Play 3
Wait 50
Sam Play 15,1,1500
Wait 100
For Z=1 To 7
  Bob Off Z
Next Z
Goto NEWGAME

_BOOM:
Boom
SHIPFLAG=1
Bob 1,SX,SY,4
Wait 10
LIVES=LIVES-1
Return

_ABOOM:
Sam Play 2
ALIENFLAG=1
Bob Off 2
D=0
For A=3 To 7
  If Col(A) Then D=A
Next A

If D=0 Then _OFFSET=0
If D=4 Then _OFFSET=30
If D=5 Then _OFFSET=60
If D=6 Then _OFFSET=90
If D=7 Then _OFFSET=120

Bob D,AX,AY+_OFFSET,4
ALIEN(D-2)=1
Wait 10
Bob Off D
BUGS=BUGS-1
SCORE=SCORE+100
Return

Vous pouvez examiner les fichiers chargés dans le programme en allant en mode direct et en tapant LISTBANK.

Aller plus vite ?

Vous avez besoin d'une animation rapide, et vous n'avez pas de compilateur ? Dans ce cas, la prochaine étape de ce voyage doit être l'AMOS Animation Language. Oui, il est temps pour une séance de AMAL.

← Retour au sommaire